home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 1843 / 1843.xpi / content / firebug / xmlViewer.js < prev    next >
Text File  |  2010-01-15  |  4KB  |  147 lines

  1. /* See license.txt for terms of usage */
  2.  
  3. FBL.ns(function() { with (FBL) {
  4.  
  5. // ************************************************************************************************
  6. // Constants
  7.  
  8. // List of XML related content types.
  9. var xmlContentTypes =
  10. [
  11.     "text/xml",
  12.     "application/xml",
  13.     "application/xhtml+xml",
  14.     "application/rdf+xml",
  15.     "application/vnd.mozilla.xul+xml",
  16. ];
  17.  
  18. // ************************************************************************************************
  19. // Model implementation
  20.  
  21. /**
  22.  * @module Implements viewer for XML based network responses. In order to create a new
  23.  * tab wihin network request detail, a listener is registered into
  24.  * <code>Firebug.NetMonitor.NetInfoBody</code> object.
  25.  */
  26. Firebug.XMLViewerModel = extend(Firebug.Module,
  27. {
  28.     dispatchName: "xmlViewer",
  29.  
  30.     initialize: function()
  31.     {
  32.         Firebug.ActivableModule.initialize.apply(this, arguments);
  33.         Firebug.NetMonitor.NetInfoBody.addListener(this);
  34.     },
  35.  
  36.     shutdown: function()
  37.     {
  38.         Firebug.ActivableModule.shutdown.apply(this, arguments);
  39.         Firebug.NetMonitor.NetInfoBody.removeListener(this);
  40.     },
  41.  
  42.     /**
  43.      * Check response's content-type and if it's a XML, create a new tab with XML preview.
  44.      */
  45.     initTabBody: function(infoBox, file)
  46.     {
  47.         if (this.isXML(safeGetContentType(file.request)))
  48.         {
  49.             Firebug.NetMonitor.NetInfoBody.appendTab(infoBox, "XML",
  50.                 $STR("xmlviewer.tab.XML"));
  51.  
  52.         }
  53.     },
  54.  
  55.     isXML: function(contentType)
  56.     {
  57.         if (!contentType)
  58.             return false;
  59.  
  60.         // Look if the response is XML based.
  61.         for (var i=0; i<xmlContentTypes.length; i++)
  62.         {
  63.             if (contentType.indexOf(xmlContentTypes[i]) == 0)
  64.                 return true;
  65.         }
  66.  
  67.         return false;
  68.     },
  69.  
  70.     /**
  71.      * Parse XML response and render pretty printed preview.
  72.      */
  73.     updateTabBody: function(infoBox, file, context)
  74.     {
  75.         var tab = infoBox.selectedTab;
  76.         var tabBody = infoBox.getElementsByClassName("netInfoXMLText").item(0);
  77.         if (!hasClass(tab, "netInfoXMLTab") || tabBody.updated)
  78.             return;
  79.  
  80.         tabBody.updated = true;
  81.  
  82.         this.insertXML(tabBody, file.responseText);
  83.     },
  84.  
  85.     insertXML: function(parentNode, text)
  86.     {
  87.         var parser = CCIN("@mozilla.org/xmlextras/domparser;1", "nsIDOMParser");
  88.         var doc = parser.parseFromString(text, "text/xml");
  89.         var root = doc.documentElement;
  90.  
  91.         // Error handling
  92.         var nsURI = "http://www.mozilla.org/newlayout/xml/parsererror.xml";
  93.         if (root.namespaceURI == nsURI && root.nodeName == "parsererror")
  94.         {
  95.             this.ParseError.tag.replace({error: {
  96.                 message: root.firstChild.nodeValue,
  97.                 source: root.lastChild.textContent
  98.             }}, parentNode);
  99.             return;
  100.         }
  101.  
  102.         Firebug.HTMLPanel.CompleteElement.tag.replace({object: doc.documentElement}, parentNode);
  103.     }
  104. });
  105.  
  106. // ************************************************************************************************
  107. // Domplate
  108.  
  109. /**
  110.  * @domplate Represents a template for displaying XML parser errors. Used by
  111.  * <code>Firebug.XMLViewerModel</code>.
  112.  */
  113. Firebug.XMLViewerModel.ParseError = domplate(Firebug.Rep,
  114. {
  115.     tag:
  116.         DIV({"class": "xmlInfoError"},
  117.             DIV({"class": "xmlInfoErrorMsg"}, "$error.message"),
  118.             PRE({"class": "xmlInfoErrorSource"}, "$error|getSource")
  119.         ),
  120.  
  121.     getSource: function(error)
  122.     {
  123.         var parts = error.source.split("\n");
  124.         if (parts.length != 2)
  125.             return error.source;
  126.  
  127.         var limit = 50;
  128.         var column = parts[1].length;
  129.         if (column >= limit) {
  130.             parts[0] = "..." + parts[0].substr(column - limit);
  131.             parts[1] = "..." + parts[1].substr(column - limit);
  132.         }
  133.  
  134.         if (parts[0].length > 80)
  135.             parts[0] = parts[0].substr(0, 80) + "...";
  136.  
  137.         return parts.join("\n");
  138.     }
  139. });
  140.  
  141. // ************************************************************************************************
  142. // Registration
  143.  
  144. Firebug.registerModule(Firebug.XMLViewerModel);
  145.  
  146. }});
  147.